import * as XLSX from 'xlsx';
import FileSaver from 'file-saver';

/**
 * Excel工具类
 */
export default {
  /**
   * 导出Excel
   * @param {Array} data 要导出的数据
   * @param {String} fileName 文件名
   * @param {Array} header 表头 [{ label: '显示名', prop: '字段名' }]
   */
  exportExcel(data, fileName, header) {
    // 创建工作簿
    const wb = XLSX.utils.book_new();
    
    // 转换数据格式
    const formattedData = data.map(item => {
      const row = {};
      header.forEach(h => {
        row[h.label] = item[h.prop];
      });
      return row;
    });
    
    // 创建工作表
    const ws = XLSX.utils.json_to_sheet(formattedData);
    
    // 添加工作表到工作簿
    XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
    
    // 生成Excel文件并下载
    const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'array' });
    const blob = new Blob([wbout], { type: 'application/octet-stream' });
    FileSaver.saveAs(blob, `${fileName}.xlsx`);
  },
  
  /**
   * 导入Excel
   * @param {File} file 上传的文件
   * @param {Array} header 表头映射 [{ label: '显示名', prop: '字段名' }]
   * @returns {Promise} 解析后的数据
   */
  importExcel(file, header) {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      
      reader.onload = (e) => {
        try {
          const data = new Uint8Array(e.target.result);
          const workbook = XLSX.read(data, { type: 'array' });
          
          // 获取第一个工作表
          const firstSheetName = workbook.SheetNames[0];
          const worksheet = workbook.Sheets[firstSheetName];
          
          // 将工作表转换为JSON
          const jsonData = XLSX.utils.sheet_to_json(worksheet);
          
          // 映射数据
          const mappedData = jsonData.map(row => {
            const item = {};
            header.forEach(h => {
              // 在Excel中查找与label匹配的列
              Object.keys(row).forEach(key => {
                if (key === h.label) {
                  item[h.prop] = row[key];
                }
              });
            });
            return item;
          });
          
          resolve(mappedData);
        } catch (error) {
          reject(error);
        }
      };
      
      reader.onerror = (error) => {
        reject(error);
      };
      
      reader.readAsArrayBuffer(file);
    });
  }
}; 